﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// <summary>
/// 主工程提供，热更工程里因为要尽量避免跨域继承  不提供
/// 一般单例类作为mananger类或工具类等居多，一般没有继承关系，故提取一个单例泛型类，节省重复单例代码量
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T> where T : new()
{
    //    private static T instance = (default(T) == null) ? Activator.CreateInstance<T>() : default(T);
    //
    //    public static T Instance
    //    {
    //        get
    //        {
    //            return Singleton<T>.instance;
    //        }
    //    }
    //构造函数定义protected 防止外部new实例化,但又可以被继承的类使用
    protected Singleton()
    {
    }

    /*
     * 本身是线程不安全的写法，通过lock达到线程安全（懒汉式单例）
     */
    // private static  T m_instance;
    // public static T Instance{
    // 	get{
    // 		lock (m_instance)
    // 		{
    // 			if (m_instance == null) {
    // 				m_instance = new T ();
    // 			}
    // 			return m_instance;
    // 		}
    // 	}
    // }

    /*
	 * 从写法上达到线程安全(饿汉式单例）
	 */
    private static readonly T m_instance = new T();
    public static T Instance
    {
        get
        {
            return m_instance;
        }
    }
}
